Python 文本替换教程与示例
作者:Ruben Geert van den Berg,归档于 SPSS Python 基础
- 使用花括号进行单次文本替换
- 使用花括号进行多次文本替换
- 使用 F-strings 进行文本替换
- 使用百分号进行多次文本替换
- 使用 locals() 进行多次文本替换
概述
Python 中一个非常实用的技巧是文本替换:我们将小的文本片段(例如变量名)插入到较大的文本块(例如 SPSS 语法 命令)中。
在本教程中,我们将简单地构建并打印 SPSS 语法。希望 运行 Python 生成的语法的读者可以使用 health-costs.sav 数据文件,部分数据如下所示。
使用字符串连接进行单次文本替换
在深入研究文本替换之前,我想指出的是,您可以使用简单的字符串连接来执行替换。我们的第一个示例展示了如何实现。
***使用字符串连接进行单次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars for xVar in xVars:
print("GRAPH/SCATTER " + xVar + " WITH COSTS.")
end program.
请注意,我们将一些 SPSS 变量名指定为 Python 列表,其中包含带引号的字符串。一个更好的选择是扩展 SPSS 的 TO
关键字。我们将在 使用 Python 循环处理 SPSS 命令 中展示如何实现这一点。
结果
好的,我们的字符串连接生效了。但是,它相当繁琐,尤其是对于多次文本替换。所以现在让我们尝试一些更优雅的方法。
使用花括号进行单次文本替换
对于非常基本的文本替换,只需在 Python 字符串中输入一对 花括号 {}。关闭字符串后,添加 .format()
并在括号中指定文本替换的内容。
***使用花括号进行单次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars for xVar in xVars:
print("GRAPH/SCATTER {} WITH COSTS.".format(xVar))
end program.
请注意,此代码比我们的第一个示例更简单易读。但是,它会生成完全相同的 SPSS 语法。下图说明了它的基本结构。
使用花括号进行多次文本替换
现在,让我们为我们的 SPSS 散点图语法添加更多灵活性:我们还将允许使用多个 y 变量和一个(子)标题。
由于所需的 SPSS 语法变得更长,因此明智的做法(但并非绝对必要)是使用多行来表示它。下面的示例通过将基本的 GRAPH
命令括在三引号中来实现这一点。
***使用花括号进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( '''
GRAPH/SCATTER {} WITH {}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{}'.'''.format(xVar,yVar,subTitle) )
end program.
请注意,花括号现在出现了 3 次。默认情况下,第一 对花括号被 format
后面指定的 第一 个元素替换,依此类推。
结果
除了简单地使用空花括号之外,我们可以更具体地说明要替换的内容:在下面的示例中,我们将向花括号添加索引,这些索引指向 format
指定的元组中的元素。这样,我们可以选择将这些替换插入到字符串对象中的顺序。
***使用索引进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( '''
GRAPH/SCATTER {2} WITH {1}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{0}'.'''.format(subTitle,yVar,xVar) )
end program.
也许比索引更好的是,我们还可以为占位符选择名称。这些名称可以与已经定义的 Python 对象相对应,也可以不对应。
***使用名称进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( '''
GRAPH/SCATTER {x} WITH {y}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{subTitle}'.'''.format(subTitle = subTitle,y = yVar,x = xVar) )
end program.
关于此语法,请注意:
- 占位符
{x}
被xVar
替换; - 占位符
{y}
被yVar
替换; - 占位符
{subTitle}
被subTitle
替换。
使用 F-Strings 进行文本替换
Python 3.6(适用于 SPSS 27 或更高版本)引入了 f-strings:我们可以使用先前定义的 Python 对象作为占位符名称,如果在字符串前面加上 “f”(代表 format ),则无需任何进一步的规范。
***使用 F-string 进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( f'''
GRAPH/SCATTER {xVar} WITH {yVar}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{subTitle}'.''' )
end program.
请注意,这与使用 locals()
非常相似。
如果需要,您可以将其与原始字符串结合使用,这基本上禁用了使用反斜杠的转义。
***原始 F-string 示例。**
begin program python3.= 'ruben'
subFolder print( rf'd:\data\new file\\{subFolder}\here')
end program.
使用百分号进行多次文本替换
Python 中一种较旧的文本替换方法是使用百分号表示的转义序列:
- 使用
%s
作为字符串的占位符; - 使用
%d
作为整数的占位符; - 使用
%f
作为 浮点数 的占位符。
在指定某个字符串之后,指定您的文本替换作为以百分号开头的元组。
***使用 % 进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( '''
GRAPH/SCATTER %s WITH %s
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '%s'.'''%(xVar,yVar,subTitle) )
end program.
有点令人惊讶的是,%s
通常也适用于数字和字符串。
使用 locals() 进行多次文本替换
如前所述,您可以使用 f-strings 直接将 Python 对象插入字符串中。一种类似的老方法是 locals()
。下面的语法展示了它的工作原理。
***使用 locals() 进行多次文本替换。**
begin program python3.= ['alco','cigs','exer']
xVars = 'costs'
yVar = 'All Respondents | N = 525'
subTitle for xVar in xVars:
print( '''
GRAPH/SCATTER %(xVar)s WITH %(yVar)s
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '%(subTitle)s'.'''%locals() )
end program.
请注意,%(xVar)s
是(已经定义的)xVar
字符串对象的占位符。在定义某个字符串后添加 %locals()
确认所有占位符都将被局部变量替换:具有相同名称的先前定义的 Python 对象。
在结束之前,我应该指出,本教程中讨论的文本替换被称为 Python 字符串格式化。而且它比我在这里讨论的要 多得多 。
幸运的是,我们只需要基础知识就可以在 SPSS 中使用 Python 完成工作。